package me.zhengjie.common.config

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Swagger配置，更新到3.0
 * kuki
 * 2022-01-02
 */
//@RequiredArgsConstructor //@EnableOpenApi
//@EnableSwagger2
@Configuration
//class SwaggerConfig : WebMvcConfigurer {
class SwaggerConfig {
    @Autowired
    private val swaggerProperties: SwaggerProperties? = null

    @Value("\${jwt.header}")
    private val tokenHeader: String? = null

    @Value("\${swagger.basic.enable}")
    private val enabled: Boolean? = null

    @Bean
    fun springShopOpenAPI(): OpenAPI {
        return OpenAPI()
            .info(
                Info().title("VUE-ADMIN-KUKI基础平台")
                    .contact(Contact().name("Kuki Wu").email("zjkuki@21cn.com"))
                    .description("VUE-ADMIN-KUKI基础平台 RESTful API")
                    .version("v1.0.0")
                    .license(License().name("Apache 2.0").url("http://springdoc.org"))

            )
    }
}

//    @Bean
//    fun createRestApi(): Docket {
//        //----swagger3.0.0
//        /* return new Docket(DocumentationType.OAS_30).pathMapping("/")
//                // 定义是否开启swagger，false为关闭，可以通过变量控制
//                .enable(swaggerProperties.getEnable())
//
//                // 将api的元信息设置为包含在json ResourceListing响应中。
//                .apiInfo(apiInfo())
//
//                // 接口调试地址
//                .host(swaggerProperties.getTryHost())
//
//                .globalRequestParameters(Lists.newArrayList(
//                        new RequestParameterBuilder()
//                                .name("debug")
//                                .description("ignore authorization")
//                                .in(ParameterType.HEADER)
//                                // 类内部创建了默认的builder以供属性设置
//                                .query(parameterSpecificationBuilder -> parameterSpecificationBuilder.defaultValue("Bearer ")
//                                        .allowEmptyValue(true))
//                                .build(),
//                        new RequestParameterBuilder()
//                                .name(tokenHeader)
//                                .description("token")
//                                .query(parameterSpecificationBuilder -> parameterSpecificationBuilder.defaultValue("Bearer ")
//                                        .allowEmptyValue(true))
//                                .in(ParameterType.HEADER)
//                                .build()
//                ))
//
//                // 选择哪些接口作为swagger的doc发布
//                .select()
//                //.apis(RequestHandlerSelectors.any())
//                .apis(RequestHandlerSelectors.basePackage("me.zhengjie"))
//                //.paths(Predicates.not(PathSelectors.regex("/error.*")))
//                //.paths(PathSelectors.regex("/error.*").negate())
//                .paths(PathSelectors.regex("^(?!/error).*"))
//                //.paths(PathSelectors.regex("(?!/error.*).*").negate())
//                //.paths(PathSelectors.any())
//                .build()
//
//                // 支持的通讯协议集合
//                .protocols(newHashSet("https", "http"))
//
//                // 授权信息设置，必要的header token等认证信息
//                .securitySchemes(securitySchemes())
//
//                // 授权信息全局应用
//                .securityContexts(securityContexts());
//
//        */
//
//        //--------swagger2.9.2
//        val ticketPar = ParameterBuilder()
//        val pars: MutableList<Parameter> = ArrayList()
//        ticketPar.name(tokenHeader).description("token")
//            .modelRef(ModelRef("string"))
//            .parameterType("header")
//            .defaultValue("Bearer ")
//            .required(true)
//            .build()
//        pars.add(ticketPar.build())
//        return Docket(DocumentationType.SWAGGER_2)
//            .enable(enabled!!)
//            .apiInfo(apiInfo())
//            .select()
//            .apis(RequestHandlerSelectors.basePackage("me.zhengjie"))
//            //.paths(convertJavaPredicateToGuavaPredicate(PathSelectors.regex("/error.*").negate()))
//            .paths(PathSelectors.any())
//            .build()
//            .globalOperationParameters(pars)
//    }
//    fun <T> convertJavaPredicateToGuavaPredicate(javaPredicate: JavaPredicate<T>): Predicate<T> {
//        return Predicate { javaPredicate.test(it) }
//    }
//    /**
//     * API 页面上半部分展示信息
//     */
//    private fun apiInfo(): ApiInfo {
//        return ApiInfoBuilder().title(swaggerProperties!!.applicationName + " Api Doc")
//            .description(swaggerProperties.applicationDescription)
//            .contact(Contact("lighter", null, "123456@gmail.com"))
//            .version("Application Version: " + swaggerProperties.applicationVersion + ", Spring Boot Version: " + SpringBootVersion.getVersion())
//            .build()
//    }
//
//    /**
//     * 设置授权信息
//     */
//    private fun securitySchemes(): List<SecurityScheme> {
//        val apiKey = ApiKey("BASE_TOKEN", "token", In.HEADER.toValue())
//        return listOf<SecurityScheme>(apiKey)
//    }
//
//    /**
//     * 授权信息全局应用
//     */
//    private fun securityContexts(): List<SecurityContext> {
//        return listOf(
//            SecurityContext.builder()
//                .securityReferences(listOf(SecurityReference("BASE_TOKEN", arrayOf(AuthorizationScope("global", "")))))
//                .build()
//        )
//    }
//
//    @SafeVarargs
//    private fun <T> newHashSet(vararg ts: T): Set<T>? {
//        return if (ts.size > 0) {
//            LinkedHashSet(Arrays.asList(*ts))
//        } else null
//    }
//
//    /**
//     * 通用拦截器排除swagger设置，所有拦截器都会自动加swagger相关的资源排除信息
//     */
//    override fun addInterceptors(registry: InterceptorRegistry) {
//        try {
//            val registrationsField = FieldUtils.getField(
//                InterceptorRegistry::class.java, "registrations", true
//            )
//            val registrations = ReflectionUtils.getField(registrationsField, registry) as List<InterceptorRegistration>?
//            if (registrations != null) {
//                for (interceptorRegistration in registrations) {
//                    interceptorRegistration
//                        .excludePathPatterns("/swagger**/**")
//                        .excludePathPatterns("/webjars/**")
//                        .excludePathPatterns("/v3/**")
//                        .excludePathPatterns("/doc.html")
//                }
//            }
//        } catch (e: Exception) {
//            e.printStackTrace()
//        }
//    }
//}

/**
 * 将Pageable转换展示在swagger中
 */
/*@Configuration
internal class SwaggerDataConfig {
    @Bean
    fun pageableConvention(resolver: TypeResolver): AlternateTypeRuleConvention {
        return object : AlternateTypeRuleConvention {
            override fun getOrder(): Int {
                return Ordered.HIGHEST_PRECEDENCE
            }

            override fun rules(): List<AlternateTypeRule> {
                return Lists.newArrayList(
                    AlternateTypeRules.newRule(
                        resolver.resolve(
                            Pageable::class.java
                        ), resolver.resolve(Page::class.java)
                    )
                )
            }
        }
    }

    @ApiModel
    @Data
    private class Page {
        @ApiModelProperty("页码 (0..N)")
        private val page: Int? = null

        @ApiModelProperty("每页显示的数目")
        private val size: Int? = null

        @ApiModelProperty("以下列格式排序标准：property[,asc | desc]。 默认排序顺序为升序。 支持多种排序条件：如：id,asc")
        private val sort: List<String>? = null
    }
}*/